#include "TcpServer.hpp"        // 处理IO
#include "SvrCal.hpp"           // 处理业务

// 处理底层接收到的数据, 可能不一定是完整报文
void onMessage(std::weak_ptr<Connection> conn)
{
    auto realConn = conn.lock();
    if(realConn == nullptr) {
        log(WARNING, "In acceptLink(), Object no longer exists.\n");
        return;
    }
    // log(DEBUG, "onMessage(), inBuffer: %s", realConn->getInBuffer().c_str());
    // 对报文进行处理
    std::unique_ptr<SvrCal> cal = std::make_unique<SvrCal>();
    std::string res = cal->doCalculate(realConn->getInBuffer());
    // 将res发送出去
    if(res.empty())    return;
    log(DEBUG, "onMessage() encode result: \n%s", res.c_str());
    // 添加到输出缓冲区
    realConn->appendOutBuffer(res.c_str());
    // 通过回指指针, 调用写方法的回调
    auto tcpServerPtr = realConn->_tcpServerPtr.lock();
    if(tcpServerPtr == nullptr)    return;
    tcpServerPtr->writeData(realConn);
}

int main()
{
    try {
        std::shared_ptr<TcpServer> svr(new TcpServer(9000, onMessage));
        svr->initServer();
        svr->runServer();
    } catch(const std::exception& e) {
        std::cerr << e.what() << '\n';
    }
    return 0;
}